home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
public
/
bit
/
src
/
medianf.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
5KB
|
240 lines
/*
* $Id: medianf.c,v 0.91 1994/02/20 00:53:30 zhao Pre-Release $
*
*. This file is part of BIT shareware package. After the two weeks of
* free evaluation period, you are encouraged (required) to register
* your copy for a small registration fee, which is $35 for personal use
* and $50 for commercial, government and institutional use.
*
* Copyright(c) 1993, 1994 by T.C. Zhao.
* All rights reserved.
*
* Permission to use, copy, and distribute this software in its entirety
* for non-commercial purposes is hereby granted, provided that the
* above shareware and copyright notices and this permission notice
* appear in all copies and their documentation.
*
* This software may be modified for your own use, but modified versions
* may not be distributed without prior consent of the author.
*
* This software is provided "as is" without expressed or implied
* warranty of any kind.
*
*.
*
* Purpose:
* A. Perform a median filtering on the image or a part of it.
* B. Sharpen an image or a part of it via convolution
*
*/
#if !defined(lint) && defined(F_ID)
char *id_mdf = "$Id: medianf.c,v 0.91 1994/02/20 00:53:30 zhao Pre-Release $";
#endif
#include "bit.h"
#include "extern.h"
/************** Local variables ********************/
static Rect_t medfreg, *mr; /* current region */
static int rbcolor = 1; /* rubber band color */
/***************** Median Filtering *******************************{*/
/**************** Local functions *************************/
static int medianf_init(IPTR, int);
static int medianf_keybd(int);
static int medianf_popup(IPTR);
/****************************************************************
* Global entry point
****************************************************************/
int
do_medianf(IPTR im)
{
short val;
long dev;
int done = 0;
mr = &medfreg;
medianf_init(im, 0);
install_wm_handler(medianf_init);
do
{
dev = rubber_info(win_id, &val, &mr->x, &mr->y,
&mr->w, &mr->h, rbcolor, 15);
switch ((dev = bit_handle_event(dev, val)))
{
case MENUBUTTON:
done = val && medianf_popup(im);
break;
case KEYBD:
done = medianf_keybd(val);
break;
}
}
while (!done);
set_current_window(win_id);
rubber_finish();
remove_wm_handler(medianf_init);
return 0;
}
/**********************************************************************
* Initialize rubber band location. Also handles window repositioning
* and window resizing
**********************************************************************/
static int
medianf_init(IPTR im, int wme)
{
static int oxi, oyi;
set_rubber_obj(RB_RECT);
set_rubber_bounds(1, im->xi, im->yi, im->w, im->h);
if (wme)
{
mr->x += im->xi - oxi;
mr->y += im->yi - oyi;
oxi = im->xi;
oyi = im->yi;
}
else
{
mr->x = oxi = im->xi;
mr->y = oyi = im->yi;
mr->w = im->w;
mr->h = im->h;
}
return 0;
}
static int
medianf_popup(IPTR im)
{
static long mm = -1;
if (mm < 0)
mm = defpup("MedianF%t|Doit|Done");
switch (dopup(mm))
{
case 1:
img_median_filter(im, mr);
return 0;
case 2:
return 1;
}
return 0;
}
/* ARGSUSED */
static int
medianf_keybd(int val)
{
return val == 27;
}
/***********************************************************************
* End of Median filtering
*******************************************************************}**/
/************************************************************************
* Sharpen an image. If we are to use threshold, smooth.c
* might be a better place for this
***********************************************************************/
#define sharpen_init medianf_init
#define sharpen_keybd medianf_keybd
static int sharpen_popup(IPTR);
int
do_sharpen(IPTR im)
{
short val;
long dev;
int done = 0;
mr = &medfreg;
sharpen_init(im, 0);
install_wm_handler(sharpen_init);
do
{
dev = rubber_info(win_id, &val, &mr->x, &mr->y,
&mr->w, &mr->h, rbcolor, 15);
switch ((dev = bit_handle_event(dev, val)))
{
case MENUBUTTON:
done = val && sharpen_popup(im);
break;
case KEYBD:
done = sharpen_keybd(val);
break;
}
}
while (!done);
set_current_window(win_id);
rubber_finish();
remove_wm_handler(sharpen_init);
return 0;
}
static int **m, sn;
static short m_sp3x3[3][3] =
{
{-1, -2, -1},
{-2, 20, -2},
{-1, -2, -1}
};
static void
make_s_mat(int n)
{
int i, j;
/* currently on 3x3 is supported */
n = 3;
free_mat(m);
m = get_mat(n, n, sizeof(int));
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
m[i][j] = m_sp3x3[i][j];
sn = n;
}
static int
sharpen_popup(IPTR im)
{
static long smenu = -1;
int status = 0;
if (smenu < 0)
{
smenu = defpup("Sharpen%t|Doit|Done");
make_s_mat(3);
}
switch (dopup(smenu))
{
case 1:
status = img_convolv(im, m, sn, sn, 0, mr, "Sharpening ...");
break;
case 2:
status = 1;
}
return status;
}